package com.itheima.jvm;


/**
 * 功能: 描述.
 *
 * @author Fire Fish
 * @since 2022-05-02 9:21 上午
 */
public class HelloWorld {
//	// 1、打印HelloWorld的内存图解
//	public static void main(String[] args) {
//		/**
//		 *          0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
//		 *          3: ldc           #3                  // String HelloWorld
//		 *          5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V    // invokevirtual objectref, value,value
//		 *          8: return
//		 */
//		System.out.println("HelloWorld");
//	}

	// 2、加法的内存图解
//	public static void main(String[] args) {
//		int a = 10;
//		int b = Short.MAX_VALUE + 1;
//		int c = a + b;
//		System.out.println(c);
//	}

//	// ### 3、自增指令图解
//	public static void main(String[] args) {
//		/**
//		 *          0: bipush        10
//		 *          2: istore_1
//		 *          3: iload_1
//		 *          4: iinc          1, 1
//		 *          7: iinc          1, 1
//		 *         10: iload_1
//		 *         11: iadd
//		 *         12: iload_1
//		 *         13: iinc          1, -1
//		 *         16: iadd
//		 *         17: istore_2
//		 *         18: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
//		 *         21: iload_1
//		 *         22: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
//		 *         25: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
//		 *         28: iload_2
//		 *         29: invokevirtual #3                  // Method java/io/PrintStream.println:(I)V
//		 *         32: return
//		 */
//		int m = 10;
//		int n = m++  + ++m + m--;
//		// 10 + 12 + 12
//
//		System.out.println(m);
//		System.out.println(n);
//	}

//	// ### 4、if语句底层字节码图解
//	public static void main(String[] args) {
//		/**
//		 *          0: iconst_0
//		 *          1: istore_1
//		 *          2: iload_1
//		 *          3: iflt          13            // Branch if int comparison with zero succeeds。 --> if less than, <
//		 *          6: sipush        1314
//		 *          9: istore_1
//		 *         10: goto          17
//		 *         13: sipush        520
//		 *         16: istore_1
//		 *         17: return
//		 */
//		int a = 0;
//		if (a >= 0) {
//			a = 1314;
//		} else {
//			a = 520;
//		}
//	}

//	// 5、for语句底层字节码指令
//	public static void main(String[] args) {
//		for (int i = 0; i < 4; i++) {
//			/**
//			 *          0: iconst_0
//			 *          1: istore_1
//			 *          2: iload_1
//			 *          3: iconst_4
//			 *          4: if_icmpge     13             如果是if int compare greater equals ===> iload_1 >= iconst_4则跳转13【只所以确定是iload_1在前面是因为结合了官方的文档的说明和操作数栈的变化】
//			 *          7: iinc          1, 1       // 自增指令（仅仅在局部变量表操作）
//			 *         10: goto          2
//			 *         13: return
//			 */
//		}
//	}

//	// 6、while语句底层字节码指令
//	public static void main(String[] args) {
//		/**
//		 *          0: iconst_0
//		 *          1: istore_1
//		 *          2: iload_1
//		 *          3: iconst_4
//		 *          4: if_icmpge     13         // 跟特定操作数比较指令。   if int compare greater equals >= OP 就跳转。 如 iload_1 >= iconst_4就跳转13行
//		 *          7: iinc          1, 1
//		 *         10: goto          2
//		 *         13: returniconst_4
//		 */
//
////		int a,b,c,d,e,f,g = 0;
//		int i = 1;
//		while (i < 4) {
//			i++;
//		}
//	}


//	// 7、do-while语句底层字节码指令
//	public static void main(String[] args) {
//		/**
//		 *          0: iconst_0
//		 *          1: istore_1
//		 *          2: iinc          1, 1
//		 *          5: iload_1
//		 *          6: iconst_4
//		 *          7: if_icmplt     2
//		 *         10: return
//		 */
//		int i = 0;
//		do {
//			i++;
//		} while (i < 4);
//	}


//	static int i = 100;
//	static {
//		i = 200;
//		number = 10;
//		System.out.println(number); // ERROR:Illegal forward reference
//	}
//	static {
//		i = 300;
//	}
//	static int number = 230;
//
//	// 8、静态代码块底层字节码
//	public static void main(String[] args) {
//		/**
//		 *          0: bipush        100
//		 *          2: putstatic     #2                  // Field i:I           // 出栈并给字段设置值
//		 *          5: sipush        200
//		 *          8: putstatic     #2                  // Field i:I
//		 *         11: sipush        300
//		 *         14: putstatic     #2                  // Field i:I
//		 *         17: return
//		 */
//	}

//	// 9、构造方法和成员变量底层字节码
//	// 定义成员变量
//	String name = "张三";
//	int age = 10;
//
//	// 构造方法
//	public HelloWorld(){
//		/**
//		 *          0: new           #2                  // class org/fenixsoft/jvm/chapter8/HelloWorld
//		 *          3: dup
//		 *          4: invokespecial #3                  // Method "<init>":()V     // 调用本类构造法方法    invokevirtual dup
//		 *          7: astore_1                         // 保存new的对象指针到1号槽位
//		 *          8: return
//		 */
////		HelloWorld helloWorld = new HelloWorld();
//	}
//	public HelloWorld(String name, int age) {
//		/**
//		 *         28: aload_0                                      // 第0号槽位，是this变量（猜测的    ）
//		 *         29: aload_1                                      // 第一个参数name，在1号槽位
//		 *         30: putfield      #3                  // Field name:Ljava/lang/String;
//		 *         33: aload_0
//		 *         34: iload_2                                      // 第二个参数name，在2号槽位
//		 *         35: putfield      #4                  // Field age:I
//		 */
//		this.name = name;
//		this.age = age;
//	}
//
//	// 成员代码块
//	{
//		name = "李四";
//		age = 20;
//	}
//
//
//	public static void main(String[] args) {
//		/**
//		 *          0: new           #6                  // class org/fenixsoft/jvm/chapter8/HelloWorld
//		 *
//		 *          3: dup
//		 *          4: ldc           #7                  // String 王五
//		 *          6: bipush        30
//		 *          8: invokespecial #8                  // Method "<init>":(Ljava/lang/String;I)V
//		 *
//		 *         11: astore_1
//		 *
//		 *         12: getstatic     #9                  // Field java/lang/System.out:Ljava/io/PrintStream;
//		 *         15: aload_1
//		 *         16: getfield      #3                  // Field name:Ljava/lang/String;
//		 *         19: invokevirtual #10                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
//		 *
//		 *         22: getstatic     #9                  // Field java/lang/System.out:Ljava/io/PrintStream;
//		 *         25: aload_1
//		 *         26: getfield      #4                  // Field age:I
//		 *         29: invokevirtual #11                 // Method java/io/PrintStream.println:(I)V
//		 *
//		 *         32: return
//		 */
//		// 创建学生类对象（待参数构造）
//		HelloWorld stu = new HelloWorld("王五", 30);
//		// 显示输出结果
//		System.out.println(stu.name);
//		System.out.println(stu.age);
//	}


//	// 10、常用方法的底层字节码
//	public HelloWorld() {
//	}
//
//	// 私有方法
//	private void methodPrivate() {
//	}
//
//	// final方法
//	public final void methodFinal() {
//	}
//
//	// 静态方法
//	public static void methodStatic() {
//	}
//
//	public static void main(String[] args) {
//		/**
//		 *          0: new           #2                  // class org/fenixsoft/jvm/chapter8/HelloWorld
//		 *          3: dup
//		 *          4: invokespecial #3                  // Method "<init>":()V
//		 *          7: astore_1
//		 *
//		 *          8: aload_1
//		 *          9: invokespecial #4                  // Method methodPrivate:()V
//		 *
//		 *         12: aload_1
//		 *         13: invokevirtual #5                  // Method methodFinal:()V
//		 *
//		 *         16: aload_1
//		 *         17: pop
//		 *         18: invokestatic  #6                  // Method methodStatic:()V
//		 *
//		 *         21: invokestatic  #6                  // Method methodStatic:()V
//		 *         24: return
//		 */
//		HelloWorld demo = new HelloWorld();
//		demo.methodPrivate();
//		demo.methodFinal();
//		demo.methodStatic(); // 使用对象来调用静态方法会有一点点浪费：看字节码（aload_1 ---> pop ---> invokestatic）
//
//		HelloWorld.methodStatic();
//	}

//	// 11、异常try-catch底层字节码
//	public static void main(String[] args) {
//		/**
//		 *          0: bipush        100
//		 *          2: istore_1
//		 *          3: sipush        200
//		 *          6: istore_1
//		 *          7: goto          15
//
//		 *         10: astore_2                     // 吧异常信息存储在2号槽位
//		 *         11: sipush        300
//		 *         14: istore_1
//		 *         15: return
//		 *       Exception table:               // 异常表：从[3,7)如果发生异常，就执行10
//		 *          from    to  target type
//		 *              3     7    10   Class java/lang/Exception
//		 */
//		int x = 100;
//		try {
//			x = 200;
//		}catch (Exception e){
//			x = 300;
//		}
//	}

//	// 12、多个catch字节码图解
//	public static void main(String[] args) {
//		/**
//		 *          0: iconst_0
//		 *          1: istore_1
//		 *          2: bipush        11
//		 *          4: istore_1
//		 *          5: goto          26
//		 *          8: astore_2
//		 *          9: bipush        22
//		 *         11: istore_1
//		 *         12: goto          26
//		 *         15: astore_2
//		 *         16: bipush        33
//		 *         18: istore_1
//		 *         19: goto          26
//		 *         22: astore_2
//		 *         23: bipush        44
//		 *         25: istore_1
//		 *         26: return
//		 *       Exception table:
//		 *          from    to  target type
//		 *              2     5     8   Class java/lang/IndexOutOfBoundsException
//		 *              2     5    15   Class java/lang/NullPointerException
//		 *              2     5    22   Class java/lang/Exception
//		 */
//		int x = 0;
//		try {
//			x = 11;
//		}catch (IndexOutOfBoundsException e){ // 只负责try中的异常
//			x = 22;
//		}catch (NullPointerException e){ // 只负责try中的异常
//			x = 33;
//		}catch (Exception e){ // 只负责try中的异常
//			x = 44;
//		}
//	}

//	// 13、异常捕获finially底层字节码
//	public static void main(String[] args) {
//		/**
//		 *          0: bipush        100
//		 *          2: istore_1
//		 *
//		 *          3: sipush        200
//		 *          6: istore_1
//		 *
//		 *          7: sipush        400
//		 *         10: istore_1
//		 *         11: goto          33
//		 *
//		 *         14: astore_2                 // 吧异常存储在2号槽位
//		 *         15: sipush        300
//		 *         18: istore_1
//		 *
//		 *         19: sipush        400
//		 *         22: istore_1
//		 *         23: goto          33
//		 *         26: astore_3                 // 吧异常存储在3号槽位
//		 *         27: sipush        400
//		 *         30: istore_1
//		 *
//		 *         31: aload_3                 // 这个字节码为什么会多出：加载和抛出3号槽位的异常呢。答案：因为查看异常表26行，如果[3,7)或[14,19)出现了any异常，则会抛出
//		 *         32: athrow
//		 *         33: return
//		 *       Exception table:
//		 *          from    to  target type
//		 *              3     7    14   Class java/lang/Exception
//		 *              3     7    26   any                                 // 会吧error错误抛出给调用者
//		 *             14    19    26   any                                 // catch语句出现的任何exception也会被抛出
//		 */
//		int x = 100;
//		try {
//			x = 200;
//		} catch (Exception e) {
//			x = 300;
//		} finally {
//			x = 400;
//		}
//	}


//
//	// 14、线程同步synchronized底层字节码指令
//	public static void main(String[] args) {
//		/**
//		 * 0: new           #2                  // class java/lang/Object
//		 *          3: dup
//		 *          4: invokespecial #1                  // Method java/lang/Object."<init>":()V
//		 *          7: astore_1
//		 *          8: aload_1
//		 *          9: dup
//		 *         10: astore_2
//		 *         11: monitorenter
//		 *         12: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
//		 *         15: ldc           #4                  // String hello
//		 *         17: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
//		 *         20: aload_2
//		 *         21: monitorexit
//		 *         22: goto          30
//		 *         25: astore_3
//		 *         26: aload_2
//		 *         27: monitorexit
//		 *         28: aload_3
//		 *         29: athrow
//		 *         30: return
//		 *         Exception table:
//		 *          from    to  target type
//		 *             12    22    25   any             // 如果sync出现异常，字节码指令也会保证锁的退出
//		 *             25    28    25   any             // 反反复复的执行解锁，直到没有异常（？）
//		 */
//		Object lock = new Object();
//		synchronized (lock){
//			System.out.println("hello");
//		}
//	}


	public static void main(String[] args) throws InterruptedException {


		HelloWorld helloWorld = new HelloWorld();

		int a = 32;


		helloWorld.wait();


	}


}
